package br.com.yahoo.mau_mss.tutorjavafxgolfx.controller;

import java.util.logging.Level;
import java.util.logging.Logger;
import javafx.application.Application;
import javafx.beans.property.SimpleDoubleProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.TextField;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.effect.DropShadow;
import javafx.scene.layout.AnchorPane;
import javafx.scene.paint.Color;
import javafx.stage.Stage;
import org.apache.commons.lang3.StringUtils;
import br.com.yahoo.mau_mss.tutorjavafxgolfx.TutorJavaFxGolFx;
import br.com.yahoo.mau_mss.tutorjavafxgolfx.model.Produto;
import br.com.yahoo.mau_mss.tutorjavafxgolfx.service.Carrinho;
import br.com.yahoo.mau_mss.tutorjavafxgolfx.service.Vitrine;

/**
 * <p>Title: VitrineApp</p>
 * <p>Description:  </p>
 * <p>Date: Oct 11, 2013, 12:26:07 PM</p>
 * @author Mauricio Soares da Silva (mauricio.soares)
 */
public class VitrineApp extends Application {
  private AnchorPane pane;
  private TextField txPesquisa;
  private TableView<ItensProperty> tableVitrine;
  private TableColumn<ItensProperty, String> columnProduto;
  private TableColumn<ItensProperty, Double> columnPreco;
  private static ObservableList<ItensProperty> listItens = FXCollections.observableArrayList();
  public static Carrinho carrinho = new Carrinho();

  /**
   * Create a new instance of <code>VitrineApp</code>.
   */
  public VitrineApp() {
  }
  
  @Override
  public void start(Stage stage) throws Exception {
    initComponents();
    initListeners();
    Scene scene = new Scene(pane);
		stage.setScene(scene);
		stage.setTitle("Vitrine - GolFX");
		stage.show();
    initLayout();
  }
  
  @SuppressWarnings("unchecked")
  private void initComponents() {
    this.pane = new AnchorPane();
    this.pane.setPrefSize(800, 600);
    this.pane.setStyle(TutorJavaFxGolFx.STYLE_BACKGROUND);
    this.txPesquisa = new TextField();
    DropShadow ds = new DropShadow();
		ds.setSpread(0.5);
		ds.setColor(Color.web("#606060"));
		this.txPesquisa.setEffect(ds);
    this.txPesquisa.setPromptText("Digite o item para pesquisa");
    this.txPesquisa.setPrefWidth(200);
    this.txPesquisa.setFocusTraversable(false);
    this.tableVitrine = new TableView<>();
    initItens();
    this.tableVitrine.setItems(listItens);
    this.tableVitrine.setPrefSize(780, 550);
    this.columnProduto = new TableColumn<>();
    // indica qual campo estará em cada coluna
    this.columnProduto.setCellValueFactory(new PropertyValueFactory<ItensProperty, String>("produto"));
    this.columnProduto.setText("Produto");
    this.columnPreco = new TableColumn<>();
    this.columnPreco.setCellValueFactory(new PropertyValueFactory<ItensProperty, Double>("preco"));
    this.columnPreco.setText("Preço");
    this.columnProduto.prefWidthProperty().bind(this.tableVitrine.widthProperty().multiply(0.75));
    this.columnPreco.prefWidthProperty().bind(this.tableVitrine.widthProperty().multiply(0.25));
    this.tableVitrine.getColumns().addAll(this.columnProduto, this.columnPreco);
    //this.tbVitrine.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY);
    this.pane.getChildren().addAll(this.txPesquisa, this.tableVitrine);
  }
  
  private void initItens() {
    Vitrine vitrine = new Vitrine();
    for (Produto produto: vitrine.getProdutos()) {
      VitrineApp.listItens.add(new ItensProperty(produto.getProduto(), produto.getPreco()));
    }
  }
  
  private void initListeners() {
    this.txPesquisa.setOnAction(new EventHandler<ActionEvent>() {
      @Override
      public void handle(ActionEvent event) {
        if (StringUtils.isBlank(txPesquisa.getText())) {
          tableVitrine.setItems(findItems());
        } else {
          tableVitrine.setItems(VitrineApp.listItens);
        }
      }
    });
    this.tableVitrine.getSelectionModel().selectedItemProperty()
      .addListener(new ChangeListener<ItensProperty>() {
        @Override
        public void changed(
            ObservableValue<? extends ItensProperty> value,
            ItensProperty oldItem, ItensProperty newItem) {
          ItemApp.produto = new Produto(newItem.getProduto(),
              newItem.getPreco());
          ItemApp.index = tableVitrine.getSelectionModel()
              .getSelectedIndex();
          try {
            new ItemApp().start(new Stage());
          } catch (Exception e) {
            Logger.getLogger(LoginApp.class.getName()).log(Level.SEVERE, null, e);
          }
        }
    });
  }
  
  private ObservableList<ItensProperty> findItems() {
    ObservableList<ItensProperty> itensEncontrados = FXCollections.observableArrayList();
    for (ItensProperty itens:VitrineApp.listItens) {
      if (itens.getProduto().contains(this.txPesquisa.getText())) {
        itensEncontrados.add(itens);
      }
    }
    return itensEncontrados;
  }
  
  private void initLayout() {
		this.txPesquisa.setLayoutX(590);
		this.txPesquisa.setLayoutY(10);
		this.tableVitrine.setLayoutX(10);
		this.tableVitrine.setLayoutY(40);
	}
  
  public class ItensProperty {
    private SimpleStringProperty produto;
    private SimpleDoubleProperty preco;
    
    public ItensProperty(String produto, double preco) {
      this.produto = new SimpleStringProperty(produto);
      this.preco = new SimpleDoubleProperty(preco);
    }

    public String getProduto() {
      return produto.get();
    }

    public void setProduto(String produto) {
      this.produto.set(produto);
    }

    public Double getPreco() {
      return preco.get();
    }

    public void setPreco(Double preco) {
      this.preco.set(preco);
    }
  }

}